﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Compilex.Syntatic;
using Compilex.Automata;

namespace Compilex
{
    class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Computex (R) Compilex Cex (C) Versao 1.0 para MVN");
            Console.WriteLine("Copyright (C) Computex Corporation. Todos os direitos reservados.");
            Console.WriteLine();
            if (args.Length == 0)
            {
                Usage();
                return;
            }
            string sourceCode;
            try
            {
                sourceCode = File.ReadAllText(args[0]);
            }
            catch (Exception e)
            {
                Console.WriteLine("Erro: o arquivo " + args[0] + " não pode ser aberto. " + e.Message);
                return;
            }

            Syntatex compilex = null;  
            try
            {
                compilex = Syntatex.Build(sourceCode);
                compilex.SyntaticAnalyzer.Analyze();
            }
            catch (SyntaticException e)
            {
                Console.WriteLine("Erro: " + e.Message);
                return;
            }
            catch (UnrecognizedInputException e)
            {
                Console.WriteLine("Erro lexico: " + e.Message);
                return;
            }
            catch (InternalSyntaticException e)
            {
                Console.WriteLine("Ops, houve um erro interno no compilador: " + e.Message);
                return;
            }
            catch (Exception e)
            {
                Console.WriteLine("Erro inesperado: " + e.Message);
                return;
            }

            string targetfilename = Path.GetFileNameWithoutExtension(args[0]) + ".asm";
            try
            {
                File.WriteAllText(targetfilename, compilex.CompiledAssemblyCode);
                Console.WriteLine("A saida foi salva em " + targetfilename);
            }
            catch (Exception e)
            {
                Console.WriteLine("O programa foi compilado com sucesso, mas nao pode ser salvo em " + targetfilename + ": " + e.Message);
                return;
            }
        }

        private static void Usage()
        {
            Console.WriteLine("uso: compilex nomedoarquivo");
        }
    }
}
